/*
 * Copyright (c) 2006-2021, xxxx Development Team
 *
 *
 * Change Logs:
 * Date           Author       Notes
 * 2022-11-20     TSL          first version
 */
/* 头文件 ---------------------------------------------------------------------*/
#include "main.h"
#include "module_key.h"

/* 宏定义 ---------------------------------------------------------------------*/
#define KEY_DEV_INIT_AND_REGISTER(_ID_) do {        \
    fsl_single_key_init_dev(&dev_key[_ID_]);             \
    dev_key[_ID_].hw_pin_is_press = key_##_ID_##_is_press;              \
    fsl_single_key_register_dev(&dev_key[_ID_]);         \
} while(0)

#define CHECK_KEY_VALUE(_ret_, _index_, _value_) do { \
    if (_index_ < KEY_NUM_MAX) \
    { \
        if (dev_key[_index_].key_value_out == _value_) \
        { \
            _ret_ = 1; \
            dev_key[_index_].key_value_out = KEY_NONE_VAL; \
        } \
    } \
} while (0)

/* 类型定义 -------------------------------------------------------------------*/

/* 函数声明 -------------------------------------------------------------------*/
static void key_init(void);
static uint8_t key_is_click(uint8_t index);
static uint8_t key_is_double_click(uint8_t index);
static uint8_t key_is_long_press(uint8_t index);
static uint8_t key_is_long_release(uint8_t index);

static uint8_t key_0_is_press(void);
static uint8_t key_1_is_press(void);
static uint8_t key_2_is_press(void);


/* 变量声明 -------------------------------------------------------------------*/
const struct key_ops api_key =
{
    .init = key_init,
    .is_click = key_is_click,
    .is_double_click = key_is_double_click,
    .is_long_press = key_is_long_press,
    .is_long_release = key_is_long_release,
    .is_valid = fsl_single_key_is_valid,
#if FSL_SINGLE_KEY_INDICATE_MODE == FSL_SINGLE_KEY_INDICATE_BRIEF
    .register_indicate_callback = fsl_single_key_register_indicate_callback,
#endif
};
static key_dev_t dev_key[KEY_NUM_MAX];

/*
 * 函数说明
 */
void key_init(void)
{
    // 按键引脚硬件初始化
    GPIO_InitTypeDef  GPIO_InitStructure;
    RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA, ENABLE);
    // KEY0
    GPIO_StructInit(&GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_8;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    // KEY1
    GPIO_StructInit(&GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_7;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
    // KEY2
    GPIO_StructInit(&GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 按键实例初始化及注册
    KEY_DEV_INIT_AND_REGISTER(0);
    KEY_DEV_INIT_AND_REGISTER(1);
    KEY_DEV_INIT_AND_REGISTER(2);
}

/*
 * 函数说明
 */
static uint8_t key_0_is_press(void)
{
    return (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_8) == 0);
}

static uint8_t key_1_is_press(void)
{
    return (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7) == 0);
}

static uint8_t key_2_is_press(void)
{
    return (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4) == 0);
}

/*
 * 函数说明
 */
static uint8_t key_is_click(uint8_t index)
{
    uint8_t ret = 0;
    CHECK_KEY_VALUE(ret, index, KEY_CLICK_VAL);
    return ret;
}

/*
 * 函数说明
 */
static uint8_t key_is_double_click(uint8_t index)
{
    uint8_t ret = 0;
    CHECK_KEY_VALUE(ret, index, KEY_D_CLICK_VAL);
    return ret;
}

/*
 * 函数说明
 */
static uint8_t key_is_long_press(uint8_t index)
{
    uint8_t ret = 0;
    CHECK_KEY_VALUE(ret, index, KEY_LONG_PRESS_VAL);
    return ret;
}

/*
 * 函数说明
 */
static uint8_t key_is_long_release(uint8_t index)
{
    uint8_t ret = 0;
    CHECK_KEY_VALUE(ret, index, KEY_LONG_RELEASE_VAL);
    return ret;
}
